package tasktracker.abstraction;

public interface ITaskTracker {
	/**
	 * 注册上下文对象，构造TaskTracker后必须先于其他方法调用
	 * 
	 * @param context
	 *            上下文对象，提供一些服务
	 */
	void registerContext(ITaskTrackerContext context);

	/**
	 * 获取TaskTracker的特征
	 * 
	 * @return 表示特征的对象
	 */
	ITaskTrackerCharacteristics getCharacteristics();

	/**
	 * 启动TaskTracker，表示TaskTracker的生命周期已经开始
	 * 
	 * @throws Exception
	 *             启动失败，抛出异常将导致TaskTracker的状态变成错误。在下次init成功之前框架都不使用这个TaskTracker.
	 */
	void init() throws Exception;

	/**
	 * 销毁TaskTracker，表示TaskTracker的生命周期结束，无论成功与否都不跑出异常。destroy不能应对异常终止的情况，需自行处理。
	 */
	void destroy();

	/**
	 * 开始一个任务。
	 * 
	 * @param task
	 *            任务的信息，其中包含任务的唯一ID，以及一个表示进度的对象，可以用该对象报告任务进度。
	 * @throws Exception
	 *             任务启动失败。
	 */
	void startTask(TaskInfo task) throws Exception;
	
	/**
	 * 恢复中断的任务。
	 * 
	 * @param task
	 *            任务的信息。
	 * @throws Exception
	 *             恢复失败。
	 */
	void restoreTask(TaskInfo task) throws Exception;

	/**
	 * 取消一个任务，设置该任务状态为取消。
	 * 
	 * @param guid
	 *            任务的唯一ID
	 * @throws Exception
	 *             取消过程中出现了错误。框架将利用进度对象获取任务状态。如果改任务不支持取消，抛出UnsupportedOperationException。
	 */
	void cancelTask(String guid) throws Exception;

	/**
	 * 删除任务使用的临时信息。
	 * 
	 * @param guid
	 *            任务的唯一ID。
	 * @return （尚未实现）表示是否需要重试。（如果信息成功删除，返回true；如果因为任务仍在占用资源，可以返回false，框架将会之后再次尝试调用removeTask）
	 * @throws Exception
	 *             删除信息过程中发生错误。框架将报告错误，但仍认为任务已经成功删除。
	 */
	boolean cleanupTask(String guid) throws Exception;
}
